<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>不可修改的原始值与可修改的对象引用</title>
</head>

<body>
  <script>
    // 原始值字符串hello
    let a = 'hello'
    // 转换大小后
    console.log(a.toUpperCase());
    // 原始值返回的依然是hello 依然没有修改成功
    console.log(a);
    a =3
    // 虽然改成了3 但只是这里的3覆盖了前面的hello，hello依然存在
    console.log(a);
    console.log(a.valueOf());
    console.log(typeof (a));
    // console.log(typeof (a.valueOf()));

    // 对象
    let b = { x: 1, y: 'wct' }
    console.log(b);
    console.log(b.x + 1);
    console.log(b.y + 1);
    // 成功添加修改对象属性
    b.x = 2
    b.y = 3
    let c = [1, 2, 3]
    console.log(c);
    // 成功添加修改数组值
    c[0] = 0
    c[2] = 4
    for (const data of c)
      console.log(data);
    // 即使两个数组每个元素相同，顺序也相同，但他们也不相等（对象也一样）
    let d = [], e = []
    console.log(d == e);
    let f = {}, g = {}
    console.log(f == g);
    console.log(f.valueOf());
    console.log(e.valueOf());
    console.log(e.toString());
    // 但是对象是引用类型，对象是按引用比较的，两个对象引用同一个地址，才会是相等的，并没有创建新的副本
    let y = []
    let p = y
    p[0] = 1
    console.log(y);
    console.log(p === y);

    // 创建新副本就显式复制对象属性或者数据元素
    let array = [7, 8, 9];
    let array1 = [];

    for (let i = 0; i < array.length; i++) {
      array1[i] = array[i];
    }
    console.log(array1);
    console.log(array1.valueOf())
    console.log(array == array1);//false
    console.log(array.toString());//7,8,9
    console.log(array[0] + 1);



    // 为了比较两个不同的副本，定义比较两个数组的函数
    function equalArrays(q, p) {
      // 两个数组引用地址相同返回true
      if (q === p) return true;
      // 两个数组引用地址不同，长度不同返回false
      if (q.length !== p.length) return false
      // 两个数组长度相同，执行for循环拿到元素，元素不同或者顺序不同返回true
      for (let i = 0; i < array.length; i++) {
        if (a[i] !== b[i]) return false
      }
      // 引用地址不同，但两个数组长度相同，元素相同并且顺序相同返回true
      return true
    }
    console.log(equalArrays(array, array1));
    console.log(equalArrays(p, y));
    console.log(equalArrays(p, array1));

    console.log([99, 10]);
    console.log(Number([99, 10]));
    console.log(Number('99, 10'));



    var i = 6
    console.log(i);
    for (var i = 0; i < array.length; i++) {
      if (a[i] !== b[i]) console.log(i);
    }
    console.log(i);

    let z = 6
    for (let z = 0; z < array.length; z++) {
      if (a[z] !== b[z]) console.log(z);
    }
    console.log(z);
  </script>
</body>

</html>